package gestores.janelas;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import javax.swing.AbstractListModel;
import model.FileD;

public class FileListModel extends AbstractListModel {

    private ArrayList<FileD> data = new ArrayList<FileD>();

    FileListModel(File diretorioescolhido) {
        File[] listFiles = diretorioescolhido.listFiles();
        for(File f : listFiles){
         data.add(new FileD(f));
        }
    }

    FileListModel() {
    }

    public boolean haveDirs(ArrayList<File> files) {
        boolean ret = false;
        for (File f : files) {
            ret = ret || f.isDirectory();
        }
        return ret;
    }

    public ArrayList<File> getFiles() {
        ArrayList<File> ret = new ArrayList<File>();
        for(FileD f : this.data){
            ret.add(new File(f.getPath()));
        }
        return ret;
    }

//    public void setItems(Map<String, File> map) {
//        this.map = map;
//        this.data.addAll(map.values());
//    }
//
//    public void addItem(File f) {
//        map.put(f.getPath(), f);
//        data.add(f);
//    }
    public int getSize() {
        return data.size();
    }

    public void addElement(File var) {
        if (!var.isDirectory()) {
            data.add(new FileD(var));
            int index = data.indexOf(var);
            fireContentsChanged(this, index, index);
        } else {
            ArrayList<File> filesFromDir = getFilesFromDir(var);
            for (File f : filesFromDir) {
                data.add(new FileD(f));
                int index = data.indexOf(f);
                fireContentsChanged(this, index, index);
            }
        }
    }

    private ArrayList<File> getFilesFromDir(File dir) {
        ArrayList<File> tempdata;
        if (dir.isDirectory()) {
            tempdata = new ArrayList<File>(Arrays.asList((File[]) dir.listFiles()));
            while (haveDirs(tempdata)) {
                ArrayList<File> toremove = new ArrayList<File>();
                ArrayList<File> toadd = new ArrayList<File>();
                for (File f : tempdata) {
                    if (f.isDirectory()) {
                        toadd.addAll(Arrays.asList((File[]) f.listFiles()));
                        toremove.add(f);
                    }
                }
                for (File f : toremove) {
                    tempdata.remove(f);
                }
                for (File f : toadd) {
                    tempdata.add(f);
                }
            }
        } else {
            tempdata = new ArrayList<File>();
            tempdata.add(dir);
        }
        return tempdata;
    }

    private File getFileByPath(String path) {
        for (File f : data) {
            if (f.getPath().equals(path)) {
                return f;
            }
        }
        return null;
    }

    public void removeElement(String path) {
        int idx = data.indexOf(getFileByPath(path));
        this.removeElement(idx);
    }

    public void removeElement(Object o) {
        int idx = data.indexOf(o);
        this.removeElement(idx);
    }

    public void removeElement(int index) {
        data.remove(index);
        fireIntervalRemoved(this, index, index);
    }

//    public void remove(int index) {
//        removeElement(index);
//    }
    public FileD getElementAt(int index) {
        return get(index);
    }

    public FileD get(int index) {
        return data.get(index);
    }

    public void clear() {
        this.data = new ArrayList<FileD>();
        File temp = new File("");
        this.addElement(temp);
        this.removeElement(temp);
    }
}
